八皇后问题 (c#)
问题描述:
八皇后问题是一个古老而著名的问题,是回溯算法的典型例题。该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。
我的解法:
public class Queen
{
public Queen()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
private static bool[] columflag=new bool[8]{true,true,true,true,true,true,true,true};//列占用标记 true为可用
private static bool[] leftflag=new bool[15]{true,true,true,true,true,true,true,true,true,true,true,true,true,true,true};//左行对角线占用标记
private static bool[] rightflag=new bool[15]{true,true,true,true,true,true,true,true,true,true,true,true,true,true,true};//右行对角线占用标记
private static int[,] position=new int[,]{{0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0}
};//皇后位置坐标
private static int sum=0;
public static void TryStep(int i)//i取值1至8
{
for (int j=1;j<=8;j++)
{
if (columflag[j-1]&&leftflag[i+j-2]&&rightflag[i-j+7])//如果当前位置可以放置
{
columflag[j-1]=false;
leftflag[i+j-2]=false;
rightflag[i-j+7]=false;//占用
position[i-1,j-1]=1;//加入皇后位置
if (i<8)
{
TryStep(i+1);//进入下一行
}
else
{
sum++;//解法数统计
Console.WriteLine("");
Console.WriteLine("第 {0} 种解法:",sum);
Console.WriteLine("");
for (int m=0;m<8;m++) //打印解法
{
for (int n=0;n<8;n++)
{
Console.Write("{0} ",position[m,n]);
}
Console.Write("\n");
}
}
columflag[j-1]=true;//如果不能放置时,取消占座及移走皇后
leftflag[i+j-2]=true;
rightflag[i-j+7]=true;
position[i-1,j-1]=0;
}
}
}
}